$$.web = {
	/**
	 * 返回请求的路径（即当前页面的路径）。
	 * @return {String} url
	 */
	getPath : function(){
		return Request.ServerVariables('URL')();
	}
	
	/**
	 * 获取请求的路径。
	 * @return {String}
	 */
	,getHTTP_Method : function(){
		return Request.ServerVariables('HTTP_METHOD')();
	}
	
	/**
	 * 获取 HTTP 报文的 ContentType。可支持 GET 操作下的 ContentType。
	 * @return {String}
	 */
	,getContentType : function(){
		return Request.ServerVariables('Content_Type')();
	}
	
	/**
	 * @return {String/Null}
	 */
	,getReferer : function(){
		var arr = Request.ServerVariables('all_raw')().match(/referer:\s*(.*)/i);
		return arr == null ? null : arr[0];
	}
	
	/**
	 * 是否POST提交数据。
	 * @return {Boolean}
	 */
	 ,isPOST : function(){
		return this.getHTTP_Method() == "POST";
	 }
	 
	/**
	 * 返回是否 Raw 的POST。这个方法在某种场合必须使用，例如 Ext.Direct。
	 * 约定：凡 application/json 的提交均视作 Raw POST。
	 * @return {Boolean}
	 */
	,isRawPOST : function(){
		return this.isPOST() && this.getContentType().indexOf('application/json') != -1
	}
	
	/**
	 * Raw POST 的解析器。Raw Post 也是标准 HTTP POST 方式的一种，但不像 key1=value2&key2=value2的形式提交数据，
	 * 而是一堆二进制的数据。
	 * 浏览器提交的 POST 数据视作原始的实际，须经过 Adodb.Stream 二进制解码后才可以使用。
	 * 注意：一旦使用过该方法。Request.Form('key') 就无法使用，但 QueryString 仍可用。
	 * @return {Object}
	 */
	,getRawPost : function (){
    	with(new ActiveXObject('Adodb.Stream')){
			open();
			type	 = 2;			// 2 = adTypeText
			writeText(Request.binaryRead(Request.totalBytes));
			position = 0;
			charset  = "us-ascii";	// gb2312？
			position = 2;
			eval('var requestObj = ' + readText());// 使用 eval()函数时，必须要一个变量来承载！
			close();
			return requestObj;
		}
    }
	
	/**
	 * 打印结果。
	 * @param {String} str
	 */
	,response : function(str){
		if(!str){
			throw '缺乏要输出的内容，请检查请求内容或者业务逻辑!';		
		}
		Response.write(str);
		Response.end();
	}
	
	/**
	 * 设置媒体类型。 默认为请求时所希望的 ContentType。
	 * @param {String} contentType HTTP内容类型。默认值是text/HTML。可选的
	 */	
	,setResponseContentType : function(contentType){
		Response.ContentType = contentType || this.getContentType() || 'text/HTML';
	}
	
	/**
	 * 301 永久重定向。
	 * @param {String} url 要跳转的地址。
	 */
	,urlForward : function (url){
		Response.Status = "301 Moved Permanently";
		Response.addHeader("Location",url);
		Response.End();
	}	
	
	/**
	 * 强制不缓存。
	 */
	,noCache : function(){
		with(Response){
			buffer	= false;
			expires	= -1;
			addHeader("Pragma",		"no-cache");
			addHeader("cache-ctrol","no-cache");
		}	
	}

	/**
	 * 统一编码为UTF-8。
	 */
	,setUTF8 : function(){
		Response.Charset		= "utf-8";
		Session.CodePage		= 65001;
		Session.Timeout			= 200;
		Server.ScriptTimeout	= 100;		
	}
	
	,log : function(log){
		var json, tmp;
		
		if(log.sql){
			tmp = log.sql;
			delete log.sql;
		}
		json = $$.XML.json2xml(log);
		
		var logItem = $$.xml.doc();
		if(!logItem.loadXML('<item>' + json + '</item>')){
			throw "生成日志XML文档时错误";
		}
		var value = logItem.createElement("value");
		var cd = logItem.createCDATASection(tmp);
		
		value.appendChild(cd);
		logItem.firstChild.appendChild(value);
		// 插入新的XML节点
		var xml = new ActiveXObject('Msxml2.DOMDocument.6.0');
		if(!xml.load(Server.Mappath('/app/public/log.xml'))){
			throw "保存日志XML文档时错误";
		}
	
		xml.lastChild.appendChild(logItem.firstChild);
	
		$$.XML.saveXML(xml);
		
		logItem = xml = value = cd = null;
		
		return true;
	}
	,setXML	: function(data, wrapTag, isCDATA){
		
		this.contentType = 'text/xml';
		
		if(typeof data == 'string'){
			if(wrapTag && !isCDATA){
				data = '<{0}>{1}</{0}>'.format(wrapTag, data);
			}else if(wrapTag && isCDATA){
				data = '<{0}>' + ("<![CD" + "ATA[") + "{1}" + ("]>" + ">")  + '</{0}>'.format(wrapTag, data.replace(("]>" +">"), "]&gt;&gt;"));
			}
			return data;
		}else{
			data = $$.XML.json2xml(data);
		}
		return datal		
	}
};

;(function(){
	/**
	 * 获取来自表单的各个字段的数据。HTTP FORM所提交的数据乃是key/value配对的结构。
	 * 本函数是把这些key/value集合转化成为JavaScript对象。这是post包最核心的函数。
	 * 对各个字段有decodeURI()、unescape()、$$.getPerm()自动类型转化的功能。
	 * @param {Boolean/String} isAllRequest true表示为返回QueryString和Form的Request对象集合。
	 * 如果指定form则返回表单的hash值，如果指定 QueryString 则返回URL上面的参数hash。
	 * @return {Object} 客户端提交的数据或查询参数。
	 */
	function every(collection){
		var count	= collection.count;
		var obj		= {
			count	: count				// 字段总数
		};
		var emu		= new Enumerator(collection);
		var key, v;
		
		while(count > 0 && !emu.atEnd()){
            key		 = emu.item().toString();
            v		 = collection(key)(); 	// MS ASP这里好奇怪，不加()不能返回字符串
            
            obj[key] = $$.getPrimitives(v);	// 进行自动类型转换。
			
			emu.moveNext();
		}
        
        return obj;
	};
		
	$$.web.getQueryRequest	= every.delegate(Request.Form);
	$$.web.getFormRequest	= every.delegate(Request.QueryString);
})();